import http from './request'

class ApiService {

  constructor() {
    // 单例模式实现
    if (ApiService.instance) {
      return ApiService.instance
    }
    
    this.appKey = "9101fca7a5471bb6"
    this.sign = "OTU0Y2M5NzIwNzgwYzM4OGMwMjk1Nzc2NmIwZjUzZjk4NzEyNTFlYjg3YzA3MjIzNWVhZjEwMzJlYTE2Zjc5Zg=="
    
    // 预制的常用请求参数
    this.baseParams = {
      appKey: this.appKey,
      sign: this.sign
    }
    
    ApiService.instance = this
  }

  // 工作表ID枚举定义
  static WORKSHEETENUM = {
    PROJECTS: '6876257b872d9db2c7ba529a',
    DEMAND: '6876257b872d9db2c7ba5292',
    CANDIDATE: '6876257b872d9db2c7ba5297',
    USER: '6876257b872d9db2c7ba5290',
    // 可以继续添加更多工作表ID
  }


  async register({
    worksheetId,
    controls,
    triggerWorkflow = false 
  } = {}) {
    try {
      const requestData = {
        ...this.baseParams,
        worksheetId: worksheetId,
        controls: controls,
        triggerWorkflow: triggerWorkflow
      }

      const res = await http.post('/addRow', requestData, {
        timeout: 6000 // 单行数据使用更短超时
      })
      return res
    } catch (error) {
      console.error('【register】注册失败，错误详情:', {
        message: error.message,
        stack: error.stack,
        error: error
      })
      
      throw error
    }
  }

  async quotation(data) {
    try {
      const res = await http.withEndpoint('workflow').post('/NjhhNTJiODkzNTZlNjA1ZWYzMTdlNDMw', data)
      return res
    } catch (error) {
      console.error('【register】注册失败，错误详情:', {
        message: error.message,
        stack: error.stack,
        error: error
      })
  
      throw error
    }
  }

  
  async submitRecommend(data) {
    try {
      const res = await http.withEndpoint('workflow').post('/NjhhNmRmMzllYTA3YWMyZGEwZTg5MGQ1', data)
      return res
    } catch (error) {
      console.error('【register】注册失败，错误详情:', {
        message: error.message,
        stack: error.stack,
        error: error
      })
  
      throw error
    }
  }

  /**
   * 获取筛选行数据 - 优化版本
   * @param {string} worksheetId - 工作表ID
   * @param {boolean} notGetTotal - 是否不获取总数
   * @param {Array} filters - 筛选条件
   * @returns {Promise} 返回数据Promise
   */
  async getFilterRows({
    worksheetId,
    pageIndex = 1,
    pageSize = 20,
    notGetTotal = true,
    filters = [],
    useCache = true // 新增：是否使用缓存
  } = {}) {

    try {
      const requestData = {
        ...this.baseParams,
        worksheetId: worksheetId,
        viewId: "",
        pageIndex: pageIndex,
        pageSize: pageSize,
        notGetTotal: notGetTotal,
        filters: filters
      }

      // 对于首页数据，使用较短的超时时间
      const options = {
        timeout: pageIndex === 1 ? 8000 : 10000
      }

      const res = await http.post('/getFilterRows', requestData, options)
      return res
    } catch (error) {
      console.error('获取筛选行数据失败:', error)
      
      // 提供更友好的错误提示
      const errorMessage = this.getErrorMessage(error)
      uni.showToast({
        title: errorMessage,
        icon: 'none',
        duration: 2000
      })
      
      throw error
    }
  }

  /**
   * 根据ID获取行数据 - 优化版本
   * @param {string} rowId - 行ID
   * @param {string} worksheetId - 工作表ID
   * @param {boolean} getSystemControl - 是否获取系统控件
   * @returns {Promise} 返回数据Promise
   */
  async getRowById({
    rowId,
    worksheetId,
    getSystemControl = false
  } = {}) {
    try {
      const requestData = {
        ...this.baseParams,
        worksheetId: worksheetId,
        rowId: rowId,
        getSystemControl: getSystemControl
      }

      const res = await http.post('/getRowByIdPost', requestData, {
        timeout: 6000 // 单行数据获取使用更短超时
      })
      return res
    } catch (error) {
      console.error('根据ID获取行数据失败:', error)
      
      const errorMessage = this.getErrorMessage(error)
      uni.showToast({
        title: errorMessage,
        icon: 'none',
        duration: 2000
      })
      
      throw error
    }
  }

  /**
   * 批量预加载数据
   * @param {Array} requests - 请求配置数组
   */
  async preloadData(requests = []) {
    const preloadPromises = requests.map(config => {
      if (config.type === 'getFilterRows') {
        return http.preload('/getFilterRows', {
          ...this.baseParams,
          ...config.params
        }, 'POST')
      } else if (config.type === 'getRowById') {
        return http.preload('/getRowByIdPost', {
          ...this.baseParams,
          ...config.params
        }, 'POST')
      }
    })

    try {
      await Promise.allSettled(preloadPromises)
      console.log('数据预加载完成')
    } catch (error) {
      console.log('预加载失败，但不影响正常使用:', error)
    }
  }

  /**
   * 快速获取候选人数据（带优化）
   */
  async getCandidatesQuick(options = {}) {
    const defaultOptions = {
      worksheetId: ApiService.WORKSHEETENUM.CANDIDATE,
      pageIndex: 1,
      pageSize: 10, // 首次加载较少数据，提高速度
      notGetTotal: false,
      ...options
    }

    return this.getFilterRows(defaultOptions)
  }

  /**
   * 快速获取项目数据（带优化）
   */
  async getProjectsQuick(options = {}) {
    const defaultOptions = {
      worksheetId: ApiService.WORKSHEETENUM.PROJECTS,
      pageIndex: 1,
      pageSize: 10,
      notGetTotal: false,
      ...options
    }

    return this.getFilterRows(defaultOptions)
  }

  /**
   * 获取友好的错误信息
   * @param {Error} error - 错误对象
   * @returns {string} 友好的错误信息
   */
  getErrorMessage(error) {
    if (error.message?.includes('timeout')) {
      return '网络超时，请检查网络连接'
    } else if (error.message?.includes('Network Error')) {
      return '网络连接失败，请重试'
    } else if (error.message?.includes('401')) {
      return '登录已过期，请重新登录'
    } else if (error.message?.includes('500')) {
      return '服务器异常，请稍后重试'
    } else {
      return error.message || '请求失败，请重试'
    }
  }

  /**
   * 清除相关缓存
   * @param {string} worksheetId - 工作表ID
   */
  clearWorksheetCache(worksheetId) {
    http.clearCache(worksheetId)
  }

  /**
   * 清除所有API缓存
   */
  clearAllCache() {
    http.clearCache()
  }
}

// 创建并导出单例实例，保持向后兼容
const apiService = new ApiService()

// 同时导出类实例，方便新功能使用
export { apiService, ApiService }
